#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020-04-11 17:23
# @Author : youngchaolin

''''''

'''
迭代器：
可以更新迭代的工具，内部含有'__iter__'方法并且含有'__next__'方法的对象就是迭代器
'''

# 判断是否是迭代器 目前学到的只有文件句柄是迭代器
with open('文件.txt',encoding='utf-8',mode='w') as f:
    print('__iter__' in dir(f) and '__next__' in dir(f))

# 字符串这种可迭代对象，里面并没有__next__方法
print('__next__' in dir('messi'))

# 可迭代对象可以转换为迭代器
s='messi'
it=iter(s)
print(it,type(it))
# it是迭代器了，可以使用next取值
print(it.__next__())
print(next(it))
print(next(it))
print(next(it))
print(next(it))


# 列表转换为迭代器，然后对迭代器循环打印
li=['messi','ronald','herry']
it=iter(li)
# 循环控制次数
for index in range(len(li)):
    print(next(it))


# 迭代器的作用
'''
优点：
1 节省内存空间，考虑一下文件句柄，如果使用readlines方法，内存可能直接就爆了，但是使用readline读一行处理一行，就会节省内存空间
2 惰性机制，next一次，取一次值，绝不会多取值
当扫描内存中放不下数据集的时候，可以采用惰性获取数据的方式，按需一次获取一个数据，这就是迭代器模式
缺点：
1 速度慢
2 不走回头路
'''

# 不走回头路
li=[0,1,2,3,4,5,6,77,88,99]
it=iter(li)
for i in range(7):
    print(it.__next__())

print('----分割线----')

for i in range(3):
    print(next(it))

print('--是否有走回头路--')

# 对比一下，可迭代对象可走回头路
count=0
for item in li:
    if count==7:
        break
    else:
        print(item)
    count+=1
print('----分割线----')
count=0
for item in li:
    if count==3:
        break
    else:
        print(item)
    count+=1


'''
可迭代对象和迭代器的对比
可迭代对象优点：存储数据相对较少，操作方法比较多，看上去比较具体。
可迭代对象缺点：当内存足够多，侧重于对数据的灵活处理，可以使用它
迭代器优点：当数据量太大可能撑爆内存时，就可以考虑使用迭代器了，它的惰性机制可以有效的规避撑爆风险。
迭代器缺点：通过next方法取值，可以记录位置，但是操作方法比较单一
'''
print('----分割线----')
# while循环模拟for循环取值
li=[0,1,2,3,4,5,6,7,8,9]
it=iter(li)

while True:
    try:
        print(next(it))
    # 当捕获到错误，就跳出while循环
    except StopIteration:
        break



